﻿#ifndef __GAF_SCENE_H__
#define __GAF_SCENE_H__

namespace GAF
{
	//class Graphics -* ForEach
		//class Face
			//class CommandFace
				class Scene;
}
typedef GAF::Scene			GAF_CScene;

#include "GAF_Define.h"
#include "GAF_CommandFace.h"
#include "GAF_Layout.h"
#include "GAF_Window.h"
#include "GAF_Canvas.h"
#include "GAF_Struct.h"
#include "GAF_Platform.h"

#define GAF_ID_OK			1
#define GAF_ID_CANCEL			0
#define GAF_ID_YES			1
#define GAF_ID_NO			0
#define GAF_ID_ERROR			255

namespace GAF
{
	/// 场景类
	class _ABSTRACT Scene : public CommandFace
	{
	public:
		Scene();
		virtual ~Scene();

	/**
	 *  @name 事件成员
	 */
		// 继承事件
// 	public:
// 		virtual bool		OnPreRender(Graphics* pGraphics);		// 当渲染场景之前时
// 		virtual bool		OnRender();					// 当渲染场景时
// 	protected:
// 		virtual bool		OnInit(Bundle* pParam);				// 当场景初始化时
// 		virtual void		OnKeyDown(int nKeyCode);			// 当按键按下时
// 		virtual void		OnKeyUp(int nKeyCode);				// 当按键抬起时
// 		virtual void		OnPointDown(int nKeyCode, int nX, int nY);	// 当屏幕点按下时
// 		virtual void		OnPointUp(int nKeyCode, int nX, int nY)	;	// 当屏幕点抬起时
// 		virtual void		OnPointMove(int nKeyCode, int nX, int nY);	// 当屏幕点移动时

		// 定义事件
	public:
		/// 调用场景返回时
		virtual void		OnCallReturn(GAF_CScene* pCallScene)		// 呼叫场景返回时
					{return;}
		/// 得到命令时
		/**
		 *  @return 是否已对本命令作出相应处理
		 */
		virtual bool		OnGetCommand(Command& cmd)			// 得到命令时
					{return false;}

	protected:
		/// 场景开始时
		virtual	bool		OnStart()					// 场景开始时，返回是否允许开始
					{return true;}
		/// 场景更新时
		virtual void		OnUpdate()					// 场景更新时
					{return;}
		/// 场景结束时
		virtual bool		OnExit(bool isCommand)				// 场景结束时，返回是否允许结束
					{return true;}
		/// 场景退出时
		virtual void		OnEnd()						// 场景退出时
					{return;}
		/// 场景返回时
		virtual int		OnReturn()					// 场景返回时
					{return m_nReturn;}
		/// 场景销毁时
		virtual void		OnDestroy()
					{return;}

	/**
	 *  @name 其他成员
	 */
	public:
		/// 加载布局
		void			LoadLayout(Layout* pLayout);
		/// 卸载布局
		void			UnloadLayout();
		/// 获得布局
		Layout*			GetLayout();

		/// 设置窗口句柄
		bool			SetWindow(Window* pWindow);
		/// 获得窗口句柄
		Window*			GetWindow();

		/// 调用场景
		void			Show();
		/// 呼叫场景
		void			Call();

		/// 运行场景
		bool			Start(Scene* pBackScene);
		/// 退出场景
		bool			Exit(bool isCommand = false);
		/// 场景结束时
		void			End();
		/// 场景是否已经退出
		bool			IsExit();
		/// 场景是否正在运行
		bool			IsStart();
		/// 获得场景返回值
		int			GetReturn();

		/// 场景是否为全窗口状态
		bool			IsFullWindow();
		/// 获得底层场景
		Scene*			GetBackScene();
		/// 获得窗口尺寸
		Size*			GetWindowSize();
		/// 获得绘制句柄
		Canvas*			GetCanvas();

	protected:
		/// 返回指定返回值
		void			Return(int nReturn);
		/// 返回“确定”
		void			ReturnOK();
		/// 返回“取消”
		void			ReturnCancel();
		/// 返回“是”
		void			ReturnYes();
		/// 返回“否”
		void			ReturnNo();
		/// 返回错误值
		void			ReturnError(int nErrorCode);

	public:
		/// 场景更新
		void			Update();
		/// 场景销毁
		void			Destroy();

		/// 设置场景是否为全窗口运行
		void			FullWindow(bool isFullWindow = true);

	public:
		/// 添加到画布
		void			AddToCanvas(Graphics* pGraphics);
		/// 更新画布
		void			UpdateCanvas();
		/// 重置画布
		void			ResetCanvas();

	protected:
		/// 焦点
		CommandFace*		m_pFocus;
		/// 是否为全窗口
		bool			m_isFullWindow;
		/// 底层场景
		Scene*			m_pBackScene;
		/// 返回值
		int			m_nReturn;

	private:
		bool			m_isStart;
		bool			m_isExit;

	private:
		Layout*			m_pLayout;

		Window*			m_pWindow;
		Canvas*			m_pCanvas;
		bool			m_isUpdateCanvas;

		Platform*		m_pPlatform;			// 用于卸载GAF_ICanvas
	};
}

#endif
